package main.java;

import java.io.*;
import java.util.Iterator;
import java.util.Vector;

public class InterfazImpl implements Interfaz{
	private String[] ingredientes={"Orejas de elfo","Pan negro", "Comodin","Ajo y mandragora","Centaurguesa","Higado de oveja","Pesto y Chirivia","Queso de roca","Salsa chili","Zarzaparrilla"};
	private String[] pedidos={"Aliento de dragon","Aliento de dragon con higado","Gran mazo","Jardinera", "Jardinera con higado","Rey Troll","Trollburger","Rocaburger"};

	//muestra la mano que recibe como vector de C_producto
	public void mostrar_mano(Vector<C_producto> mano){
		Iterator<C_producto> it;
		it=mano.iterator();
		System.out.print("En tu mano tienes: ");
		while (it.hasNext()){
			System.out.print(ingredientes[it.next().get_id()] + ", ");
			}
		System.out.print("\n");
		
	}
	
	//Muestra una carta de pedido de la forma:
	//Bocadillo: (Nombre_del_pedido)
	//Ingredientes: (nombre_de_producto1), (nombre_de_producto2),...
	//Puntuacion: (valor_del_pedido) orejas de elfo
	public void mostrar_pedido(C_pedido pedido){
		Iterator<Integer> it;
		it=pedido.get_ingredientes().iterator();
		System.out.println("Bocadillo: "+pedidos[pedido.get_id()]);
		System.out.print("Ingredientes:");
		while (it.hasNext()){
			System.out.print(ingredientes[it.next()] + ", ");
			}
		System.out.print("\n");
		System.out.println("Puntuacion: " + pedido.get_precio() + " Trollars");
	}
	public void mostrar_bocadillos(Vector<Bocadillo> bocadillos){
		Iterator<Bocadillo> bocatas =bocadillos.iterator();
		Iterator <C_producto> ings;
		Bocadillo boc;
		int i=1,j;
		while (bocatas.hasNext()){
			System.out.println("Pedido "+i+":");
			boc=bocatas.next();
			mostrar_pedido (boc.get_pedido());
			if (boc.necesita_orejas())
				System.out.println("El cliente ha pedido orejas de elfo");
			for (j=1;j<=2;j++){
				System.out.println("Productos jugador "+j+" :");
				ings=boc.get_puestos(j).iterator();
				while (ings.hasNext()){
					System.out.print(ingredientes[ings.next().get_id()] + ", ");
				}
				System.out.print("\n\n");
				
				}
			i++;
			
			
		}
	}
		

	
	//Pregunta que accion quiere realizar el jugador
	public int decidir_accion(){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			int acc;
			System.out.println("\n�Que desea hacer?");
			System.out.println("1.Coger cartas");
			System.out.println("2.Descartar");
			System.out.println("3.Buscar una carta");
			System.out.println("4.Preparar bocadillos");
			System.out.println("5.Ver mi mano");
			System.out.println("6.Ver los bocadillos de la mesa");
			acc = Integer.parseInt(buff.readLine());
			if (acc<1 || acc>6){
				System.out.println("Por favor, elija una opcion entre 1 y 6");
				return decidir_accion();
				}
			else
				return acc;
		}
		catch (IOException e){
				System.out.println("Ha habido un error en la entrada");
				return decidir_accion();
		}
		catch (NumberFormatException n){
				System.out.println("Debe introducir un numero");
				return decidir_accion();
		}
	}
	public void mostrar_inicio(){
		System.out.println("TROLLBURGER");
		System.out.println("El jugador 1 es el ultimo que se haya comido una hamburguesa");
		System.out.println("Es el turno del jugador 1");
	}
	public void mostrar_final(Integer ptos_j1, Integer ptos_j2){
		System.out.println("La partida ha terminado");
		if (ptos_j1>ptos_j2){
			System.out.println("El ganador es el jugador 1 con "+(ptos_j1)+" puntos");
			System.out.println("El jugador 2 ha obtenido"+ (ptos_j2)+" puntos");
		}
		else if (ptos_j2>ptos_j1){
			System.out.println("El ganador es el jugador 2 con "+(ptos_j2)+" puntos");
			System.out.println("El jugador 1 ha obtenido"+ (ptos_j1)+" puntos");
		}else{
			System.out.println("Ha habido un empate");
			System.out.println("Ambos jugadores habeis obtenido "+(ptos_j1)+" puntos");
			}
	}
	
	//muestra una carta de producto de la forma:
	//Producto: (nombre_de_producto)
	//Numero de referencia: (num_de_ref)
	//muestra una carta de producto de la forma:
	//Producto: (nombre_de_producto)
	//Numero de referencia: (num_de_ref)
	public void mostrar_producto(C_producto p){
		System.out.println("Producto: "+ingredientes[p.get_id()]);
		if(p.get_num_ref()==0)
			System.out.println("Numero de referencia: Orejas de Elfo");
		else
			System.out.println("Numero de referencia: "+ p.get_num_ref());
		
	}
	public void mostrar_carta_referencia(C_producto p){
		System.out.println("Carta de referencia: "+ingredientes[p.get_id()]);
		if(p.get_num_ref()==0)
			System.out.println("Numero de referencia: Orejas de Elfo");
		else
			System.out.println("Numero de referencia: "+ p.get_num_ref());
		
	}
	
	//devuelve el indice en el vector de bocadillos en el que se colocaran las orejas
	//este metodo puede devolver un indice en el cual no se pueden colocar orejas
	//o incluso no hay pedido asignado
	//Antes de llamar a este metodo hay que llamar a mostrar_bocadillos
	public int decidir_orejas(){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			int elegida;
			System.out.println("Ha salido una carta con oreja de elfo");
			System.out.println("¿En que bocadillo quieres colocar las orejas?");
			elegida = Integer.parseInt(buff.readLine());
			if (elegida<1 || elegida>4){
				System.out.println("Por favor, elija una opcion entre 1 y 4");
				return decidir_orejas();
				}
			else{
				elegida--;
				return elegida;
			}
		}
		catch (IOException e){
				System.out.println("Ha habido un error en la entrada");
				return decidir_orejas();
		}
		catch (NumberFormatException n){
				System.out.println("Debe introducir un numero");
				return decidir_orejas();
		}
	}
	
	//El método elegir_buscar recibe un vector de C_producto y devuelve el índice del
	//vector escogido por el jugador
	public int elegir_buscar(Vector<C_producto> cartas){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			Iterator<C_producto> it;
			int i=1, elegido;
			it=cartas.iterator();
			System.out.println("¿Que producto quiere coger?");
			while (it.hasNext()){
				System.out.println(i+"."+ingredientes[it.next().get_id()]);
				i++;
				}
		
			elegido = Integer.parseInt(buff.readLine());
			while (elegido<1 || elegido > cartas.size()) //Sólo entra si se ha elegido una opción incorrecta
				{
				System.out.println("Por favor, elija una opcion entre las disponibles");
				elegido = Integer.parseInt(buff.readLine());
				}
			elegido--;
			System.out.println("El producto "+ingredientes[cartas.get(elegido).get_id()]+" ha sido añadido a tu mano");
			return elegido;
		}
		catch (IOException e){
				System.out.println("Ha habido un error en la entrada");
				return elegir_buscar(cartas);
		}
		catch (NumberFormatException n){
				System.out.println("Debe introducir un numero");
				return elegir_buscar(cartas);
		}
	}
	
	//Pregunta si el jugador quiere seguir con la accion que esta realizando
	//Devuelve true si quiere seguir, y false en caso contrario
	public Boolean seguir(){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			int respuesta;
			System.out.println("¿Desea seguir con la accion?");
			System.out.println("1.Sí");
			System.out.println("2.No");
			respuesta = Integer.parseInt(buff.readLine());
		
			while (respuesta<1 || respuesta > 2) //Sólo entra si se ha elegido una opción incorrecta
				{
				System.out.println("Por favor, elija una opcion entre las disponibles");
				respuesta = Integer.parseInt(buff.readLine());
				}
			return(respuesta == 1?true:false);
		}
		catch (IOException e){
			System.out.println("Ha habido un error en la entrada");
			return seguir();
		}
		catch (NumberFormatException n){
			System.out.println("Debe introducir un numero");
			return seguir();
		}
		
		
	}
	
	//
	public int elegir_descartar(Vector<C_producto> cartas){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			Iterator<C_producto> it;
			int i=1, elegido;
			it=cartas.iterator();
			System.out.println("¿De que producto quiere descartarse?");
			while (it.hasNext()){
				System.out.println(i+"."+ingredientes[it.next().get_id()]);
				i++;
				}
		
			elegido = Integer.parseInt(buff.readLine());
			while (elegido<1 || elegido > cartas.size()) //Sólo entra si se ha elegido una opción incorrecta
				{
				System.out.println("Por favor, elija una opcion entre las disponibles");
				elegido = Integer.parseInt(buff.readLine());
				}
			elegido--;
			System.out.println("Se ha descartado del producto "+ingredientes[cartas.get(elegido).get_id()]);
			return elegido;
		}
		catch (IOException e){
				System.out.println("Ha habido un error en la entrada");
				return elegir_buscar(cartas);
		}
		catch (NumberFormatException n){
				System.out.println("Debe introducir un numero");
				return elegir_buscar(cartas);
		}
	}


	public void error (int i){
		switch (i){
		case 0:
				System.out.println("No puedes realizar esta accion. Tu mano esta llena");
				break;
		case 1:
				System.out.println("No puedes realizar esta accion. Tu mano esta vacia");
				break;
		case 2:
				System.out.println("No puedes añadir este producto a este bocadillo");
				break;
		case 3:
				System.out.println("No puedes entregar este pedido");
				break;
		case 4:
				System.out.println("No hay pedidos en la mesa");
				break;
		case 5:
				System.out.println("Todos los pedidos tienen Orejas de Elfo");
				break;
		case 6:
				System.out.println("No se pueden colocar las orejas de elfo en ese bocadillo");
				break;
		}
		
	}
	
	public int elegir_carta(Vector<C_producto> mano){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			Iterator<C_producto> it;
			int i=1,elegido;
			it=mano.iterator();
			System.out.println("¿Que carta quieres añadir?: ");
			while (it.hasNext()){
				System.out.println(i+". "+ingredientes[it.next().get_id()]);
				i++;
			}
			System.out.print("\n");
			elegido = Integer.parseInt(buff.readLine());
			while (elegido<1 || elegido > mano.size()) 
				{
				System.out.println("Por favor, elija una opcion entre las disponibles");
				elegido = Integer.parseInt(buff.readLine());
				}
			elegido--;
			return elegido;
		}
		catch (IOException e){
				System.out.println("Ha habido un error en la entrada");
				return elegir_carta(mano);
		}
		catch (NumberFormatException n){
				System.out.println("Debe introducir un numero");
				return elegir_carta(mano);
		}
		
	}
	public int elegir_bocadillo(Vector<Bocadillo> bocs){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			int elegido;
			System.out.println("¿Que bocadillo?");
			mostrar_bocadillos(bocs);
			elegido = Integer.parseInt(buff.readLine());
			while (elegido<1 || elegido > bocs.size()) 
				{
				System.out.println("Por favor, elija una opcion entre las disponibles");
				elegido = Integer.parseInt(buff.readLine());
				}
			elegido--;
			return elegido;
		}
		catch (IOException e){
				System.out.println("Ha habido un error en la entrada");
				return elegir_bocadillo(bocs);
		}
		catch (NumberFormatException n){
				System.out.println("Debe introducir un numero");
				return elegir_bocadillo(bocs);
		}
		
	}
	
	public int elegir_comodin (){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			int elegido,i;
			System.out.println("¿Que ingrediente quieres que sea el comodin?");
			System.out.println("1.Orejas de elfo");
			for (i=3;i<10;i++){
				System.out.println((i-1)+". "+ingredientes[i]);
			}
			elegido = Integer.parseInt(buff.readLine());
			while (elegido<1 || elegido >9) 
				{
				System.out.println("Por favor, elija una opcion entre las disponibles");
				elegido = Integer.parseInt(buff.readLine());
				}
			if (elegido==1)
				elegido--;
			else
				elegido++;
			return elegido;
		}
		catch (IOException e){
				System.out.println("Ha habido un error en la entrada");
				return elegir_comodin();
		}
		catch (NumberFormatException n){
				System.out.println("Debe introducir un numero");
				return elegir_comodin();
		}
	}
	public void entregar_bocadillo(Boolean correcto){
		if (correcto)
			System.out.println("Has entregado el bocadillo, y se te han añadido los puntos");
		else
			{
			System.out.println("Has intentando estafar al cliente ¡pero se ha dado cuenta!");
			System.out.println("Los puntos se han añadido a tu contrincante");
			}
	}
	public void cambio_de_turno(Integer turno){
		System.out.println();
		System.out.println("Ahora es el turno del jugador "+turno);
		System.out.println();
	}
	
	public Boolean decidir_entregar(){
		try{
			BufferedReader buff =new BufferedReader (new InputStreamReader(System.in));
			int respuesta;
			System.out.println("¿Desea entregar algun pedido?");
			System.out.println("1.Sí");
			System.out.println("2.No");
			respuesta = Integer.parseInt(buff.readLine());
		
			while (respuesta<1 || respuesta > 2) //Sólo entra si se ha elegido una opción incorrecta
				{
				System.out.println("Por favor, elija una opcion entre las disponibles");
				respuesta = Integer.parseInt(buff.readLine());
				}
			return(respuesta == 1?true:false);
		}
		catch (IOException e){
			System.out.println("Ha habido un error en la entrada");
			return decidir_entregar();
		}
		catch (NumberFormatException n){
			System.out.println("Debe introducir un numero");
			return decidir_entregar();
		}
	}
	
	public void mostrar_coger_carta(C_producto carta){
		System.out.println("Has cogido la carta:");
		mostrar_producto(carta);
	}
	public void mostrar_sacar_bocadillo(C_pedido bocadillo){
		System.out.println("Ha venido un nuevo troll y ha pedido:");
		mostrar_pedido(bocadillo);
	}
	
}